<?php
require_once 'cropCanvas/class.cropcanvas.php';
require_once 'cropCanvas/class.imagemask.php';

/**
 * Clase que proporciona controles sobre imagenes
 * @author Mauro Gadaleta
 */
class imageController extends canvasCrop {

    /**
     * @var
     */
	private $pathImage;

    /**
     * @var \resource
     */
	private $image;

    /**
     * @var
     */
	private $imageType;

    /**
     * @var array
     */
	private $imageInfo = array();

    /**
     * @var array
     */
	public $errors = array();

    /**
     * Constructor set up
     * @param  $pathImage
     */
	function __construct($pathImage) {
        ini_set("memory_limit","100M");
		parent::canvasCrop(true);
		$this->pathImage = $pathImage;
		if(is_null($pathImage))
			$this->setError("No has cargado ninguna imagen valida");
		else
		{
			$this->imageInfo = getimagesize($this->pathImage);
			$this->imageType = $this->imageInfo[2];
			switch($this->imageType)
			{
				case IMAGETYPE_JPEG:
					$this->image = imagecreatefromjpeg($this->pathImage);
					break;
				case IMAGETYPE_GIF:
					$this->image = imagecreatefromgif($this->pathImage);
					break;
				case IMAGETYPE_PNG:
					$this->image = imagecreatefrompng($this->pathImage);
					break;
				default:
					$this->setError("La imagen tiene que ser jpg, gif o png");
			}
		}
	}

    /**
     * Setea un error
     * @param  $message
     * @return void
     */
	private function setError($message) { $this->errors[] = $message; }

    /**
     * Devuelve si hay errores o no
     * @return bool
     */
	function getErrors() {
		if(count($this->errors)>0)
			return true;
		else
			return false;
	}

    /**
     * Devuelva el ancho de la imagen
     * @return int
     */
	function getWidth() { return imagesx($this->image); }

    /**
     * Devuelve el alto de la imagen
     * @return int
     */
 	function getHeight() { return imagesy($this->image); }

    /**
     * Establece un nuevo ancho y alto a la imagen
     * @param  $width
     * @param  $height
     * @return void
     */
	function resizeImage($width, $height){
		if(is_null($width) || is_null($height))
			$this->setError("El valor del resize es nulo");
		else
		{
			$newImage = imagecreatetruecolor($width, $height);
			imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
			$this->image = $newImage;
		}
	}

    /**
     * Corta la imagen desde el punto 0,0 hasta los puntos x y de la imagen
     * @param  $x
     * @param  $y
     * @return void
     */
    function cropImage($x, $y) {
        $newImage = imagecreatetruecolor($x, $y);
        imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $x, $y, $x, $y);
        $this->image = $newImage;
    }

    /**
     * Escala la imagen segun el porcentaje
     * @param int $percentage
     * @return void
     */
	function scaleImage($percentage = 100){
		$width = $this->getWidth() * $percentage/100;
		$height = $this->getHeight() * $percentage/100;
		$this->resizeImage($width, $height);
	}

    /**
     * Pone un nuevo ancho a la imagen manteniendo las proporciones
     * @param  $width
     * @return void
     */
	function resizeToWidth($width) {
		$ratio = $width / $this->getWidth();
		$height = $this->getHeight() * $ratio;
		$this->resizeImage($width, $height);
	}

    /**
     * Pone un nuevo alto a la imagen manteniendo las proporciones
     * @param  $height
     * @return void
     */
	function resizeToHeight($height) {
		$ratio = $height / $this->getHeight();
		$width = $this->getWidth() * $ratio;
		$this->resizeImage($width, $height);
	}

    /**
     * @param  $destinationImage
     * @param string $maskImage
     * @param  $position
     * @return void
     */
	public function applyMaskAndSavePng($destinationImage, $maskImage = "mask.png", $position = mdTOP) {
		$temp = "../".__MEDIA__IMAGES_PATH."temp.jpeg";
		$this->saveImage($temp);
		$mask = new imageMask('00ff00');
		$mask->maskOption($position);
		if($mask->loadImage($temp))
		{
			$pathMask = "../".__MEDIA__IMAGES_PATH.$maskImage;
			if($mask->applyMask($pathMask))
				$mask->saveImage($destinationImage, 'png');
			else
				$this->setError("No se ha podido aplicar la mascara");
		}
		else
			$this->setError("No se ha podido cargar la imagen en CropCanvas");
			
		unlink($temp);
	}

    /**
     * Guarda la imagen
     * @param null $pathImage
     * @param int $imageType
     * @param int $compression
     * @param null $permissions
     * @return void
     */
	function saveImage($pathImage = null, $imageType = IMAGETYPE_JPEG, $compression = 75, $permissions = null) {
		if($this->getErrors())
			utils::myprint_r($this->errors);
		
		if(is_null($pathImage))
			$pathImage = $this->pathImage;
		
		switch ($imageType)
		{
			case IMAGETYPE_JPEG:
				imagejpeg($this->image, $pathImage, $compression);
				break;
			case IMAGETYPE_GIF:
				imagegif($this->image, $pathImage, $compression);
				break;
			case IMAGETYPE_PNG:
				imagepng($this->image, $pathImage, $compression);
				break;
			default:
				$this->setError("La imagen tiene que ser jpg, gif o png");
				break;
		}
		if(!is_null($permissions))
			chmod($pathImage, $permissions);
	}

    /**
     * Setea en blanco y negro la imagen
     * @return void
     */
    function toGrayScale() { imagefilter($this->image,IMG_FILTER_GRAYSCALE); }
}
?>